//
//  main.m
//  Copy
//
//  Created by cora1n on 14-8-12.
//  Copyright (c) 2014年 devwu. All rights reserved.
//

//拷贝 概念
//深拷贝 深复制
//完成拷贝之后,原有对象和新对象在内存中所处的位置不相同,因此,对原有文件进行改动并不会影响到新的文件
//浅拷贝
//不生成一个新的副本,因此,当原有对象改变时,该对象仍然会受到影响



//对可变对象进行copy时,发生深拷贝,原有对象的引用计数不改变
//对不可变对象进行copy时,发生浅拷贝,原有对象的引用计数+1

//使用mutableCopy时,发生深拷贝,原有对象的引用计数不改变,并且生成了一个可变的对象
//无论对任何对象进行 mutbaleCopy,均会生成一个可变对象

//NSString/NSMutableString ----mutableCOpy-----  NSMutableString
//NSArray/NSMutableArray  ----mutableCopy-----  NSMutableArray
//NSDictionary/NSMutableDictionary ----mutbaleCopy--- NSMutableDictionary


//集合发生拷贝(深/浅)时,集合中的所有元素仅仅放生了浅拷贝,引用计数+1

#import <Foundation/Foundation.h>
//copy 相关内容
#import "Person.h"
int main(int argc, const char * argv[])
{
    //copy操作
//    NSMutableString * str1 = [[NSMutableString alloc]initWithFormat:@"zhangsan"];
//    
//    NSString * str2 = [str1 copy];
//    
//    //copy 操作 将str1 的引用计数+1 ,相当于retain
//    [str1 appendString:@"33333"];
//    
//    NSLog(@"%lu",str1.retainCount);
//    
//    NSLog(@"%@",str1);
//    NSLog(@"%@",str2);
    
   //mutableCopy
//    NSString * str3 = [NSString stringWithFormat:@"test"];
//    NSLog(@"%lu",str3.retainCount);
    //通过mutableCopy 能够获取一个可变对象
//    NSMutableString * mStr = [str3 mutableCopy];
//    NSLog(@"%lu",str3.retainCount);

    
    //集合中的拷贝
//    
//    NSString * str1 = [[NSString alloc]initWithFormat:@"test1"];
//    NSString * str2 = [[NSString alloc]initWithFormat:@"test2"];
//    NSString * str3 = [[NSString alloc]initWithFormat:@"test3"];
//    
//    //对象被添加到容器中时,引用计数+1
//    //对象被从容器中移除时,引用计数-1
//    NSMutableArray * mArr = [[NSMutableArray alloc]initWithObjects:str1,str2,str3, nil];
//    NSLog(@"str1.retainCount = %lu",str1.retainCount);
//    NSLog(@"str2.retainCount = %lu",str2.retainCount);
//    NSLog(@"str3.retainCount = %lu",str3.retainCount);
//    [mArr removeObjectAtIndex:0];
//    NSLog(@"str1.retainCount = %lu",str1.retainCount);
//    NSLog(@"str2.retainCount = %lu",str2.retainCount);
//    NSLog(@"str3.retainCount = %lu",str3.retainCount);

    
    //通过mutableCopy得到的对象,引用计数均为 1
    
    
    NSMutableString * mStr1 = [@"test1" mutableCopy];
    NSArray * arr1 = @[mStr1];
    NSMutableArray * mArr1 = [arr1 mutableCopy];
    //集合发生拷贝(深/浅)时,数组中的所有元素仅仅放生了浅拷贝,引用计数+1
    NSLog(@"%lu",mStr1.retainCount);
    [mStr1 appendString:@"333"];
    
    NSLog(@"%@",arr1[0]);
    NSLog(@"%@",mArr1[0]);
    
    //为自定义的实现拷贝操作
    Person * p1 = [[Person alloc]init];
    Person* p2 = [p1 copy];
    //当我们去调用copy方法时,copyWithZone:被动调用
//    NSLog(@"p1..%lu",p1.retainCount);
//    NSLog(@"p2..%lu",p2.retainCount);
    //调用mutableCopy方法时,mutableCopyWithZone:被动调用
    Person * p3 = [p1 mutableCopy];
    NSLog(@"p1..%lu",p1.retainCount);
    NSLog(@"p2..%lu",p2.retainCount);
    NSLog(@"p3..%lu",p3.retainCount);

    
    return 0;
}

